export class Set {
    constructor() {
        this.items = {}//对象
    }

    //add方法 将元素添加到集合中
    add(value) {
        //1.先判断当前集合中是否已经包含了该元素
        if (this.has(value)) return false;
        //2.没有包含进行添加
        this.items[value] = value;
        return true;
    }

    //has方法 判断是否存在属性名
    has(value) {
        return this.items.hasOwnProperty(value);
    }

    //remove方法 
    remove(value) {
        //判断该集合中是否包含该元素
        if (!this.has(value)) return false;
        //进行删除
        delete this.items[value]
        return true;
    }

    //clear 清空对象的方法
    clear() {
        this.items = {};
    }

    //size 查询长度 Object.keys的意思是
    size() {
        return Object.keys(this.items).length;
    }

    //values  获取集合中所有的值
    values() {
        return Object.keys(this.items)
    }

    //union(otherSet)
    union(otherSet) {
        var unionSet = new Set();//创建一个新的存储用于合并的集合
        var values = this.values();//获取当前集合的属性值
        for (var i = 0; i < values.length; i++) {//循环当前集合，存入unionSet
            unionSet.add(values[i]);
        }
        values = otherSet.values();//获取要合并的集合
        for (var i = 0; i < values.length; i++) {//循环要合并的集合  add自带重复不添加
            unionSet.add(values[i]);
        }
        return unionSet;
    }
    //交集
    intersection(otherSet) {
        //this 集合对象A 
        // otherSet: 集合对象B 
        //1.先创建一个新的空集合
        var intersectionSet = new Set();
        //2.从A中取出所有的集合 用来与B集合做判断是否已经存在
        var values = this.values();
        for (var i = 0; i < values.length; i++) {
            var item = values[i];
            if (otherSet.has(item)) {
                intersectionSet.add(item);
            }
        }

        return intersectionSet;
    }
    //差集合
    difference(otherSet) {
        var difference = new Set();//创建差集合difference
        var values = this.values();
        for (var i = 0; i < values.length; i++) {
            var item = values[i]
            if (!otherSet.has(item)) {
                difference.add(item)
            }
        }
        return difference;
    }
    //子集
    subset(otherSet) {
        //判断A是否是otherSet的子集
        var values = this.values();
        for(var i = 0; i < values.length; i++) {
            if(!otherSet.has(values[i])) {
                return false
            }
        }
        return true;
    }
}

// const set = new Set();
// set.add("name1")
// set.add("name2")
// set.add("name3")
// console.log(set);

//并集
// const set1 = new Set();
// const set2 = new Set();
// set1.add("a")
// set1.add("b")
// set2.add("c")
// set2.add("a")
// const unionSet = set1.union(set2);
// console.log(unionSet);
// console.log(set1.items.hasOwnProperty("a"));
// console.log(set1.has("a"));

